'''
Python 的数据类型
'''


'''
list： 列表, 用 [] 标识 相当于 PHP 中的索引数组
'''
# 定义一个 list
classMates = ['Michael', 'Jack', 'Bob']
# 追加元素到 list 末尾: append('value'), value 为追加的元素
classMates.append('Bill')                                               # 追加元素到 list 末尾
# 插入元素到 list 指定位置： insert(i, 'value')，其中 i 为索引位置，value 为插入的元素
classMates.insert(1, 'Luck')                                            # 将元素插入到 list 指定位置
print(classMates)                                                       # 输出 list , 输出值: ['Michael', 'Luck', 'Jack', 'Bob', 'Bill']
# 删除 list 末尾的元素： pop(), 其返回值是被删除的元素
print(classMates.pop())                                                 # 删除 list 末尾的元素，输出值：Bill
# 删除指定位置的元素： pop(i)，其中 i 为索引位置，其返回值为被删除的元素
print(classMates.pop(2))                                                # 删除索引为 2 的元素，输出值：Jack
print(classMates)                                                       # 输出 list，输出值：['Michael', 'Luck', 'Bob']
print(classMates[2])                                                    # 输出指定位置的元素，输出值：Bob
print(classMates)                                                       # 输出 list，输出值：['Michael', 'Luck', 'Bob']
# 替换 list 中某个元素： list[i] = 'value'，其中 i 为索引位置，value 为替换的元素
classMates[1] = 'Sara'                                                  # 将索引为 1 的元素替换成 Sara
print(classMates)                                                       # 输出 list，输出值：['Michael', 'Sara', 'Bob']

# list 中的元素可以是不同类型
L = ['apple', 123, True]
print(L[2])                                                             # 输出索引为 2 的元素，输出值：True
print(L)                                                                # 输出 list，输出值：['apple', 123, True]

# list 中的元素可以是另一个 list
javascript = ['VUE', 'TYPESCRIPT']                                      # 定义一个 list
language = ['PYTHON', 'JAVA', ['ASP', 'ASP.NET'], 'PHP', javascript]    # 定义某一元素是另一个 list 的 list
print(language[1])                                                      # 输出索引为 1 的元素，输出值：JAVA
print(language[2])                                                      # 输出索引为 2 的元素，该元素是一个 list，输出值：['ASP', 'ASP.NET']
print(language[2][1])                                                   # 输出索引为 2 的元素中索引为 1 的元素，这里索引为 2 的元素是一个 list ，要获取该 list 中的某元素需要使用该 list 中的索引，输出值：ASP.NET
print(language)                                                         # 输出 list ,输出值：['PYTHON', 'JAVA', ['ASP', 'ASP.NET'], 'PHP', ['VUE', 'TYPESCRIPT']]
# 获取 list 的长度： len(list)，其中 list 为需要获取长度的 list
print(len(language))                                                    # 输出 list 的长度，输出值：5
print(len(language[2]))                                                 # 输出索引为 2 的 list 长度，输出值：2

# 定义一个空 list，如果 list 中一个元素都没有，就是一个空 list ，它的长度为 0
L = []
print(len(L))                                                           # 输出 list 的长度，输出值：0
print(L)                                                                # 输出 list ，输出值：[]


'''
tuple ：元组 用 () 标识，一旦初始化就不能再修改
'''
# 定义一个空 tuple
t = ()
print(t)                                                                # 输出 tuple，输出值：()

'''
在 Python 中，括号()既可表示 tuple ，又可以表示数学公式中的小括号，
如果定义只有一个元素的 tuple ，元素后面必须加一个逗号(,)来消除歧义
'''
t1 = (1)                                                                # 这样定义 tuple ， Python 会把括号当成数学公式中的小括号进行计算而不是当作定义 tuple
print(t1)                                                               # 输出 1， 这里 () 被当成小括号了，输出值：1

# 定义只有 1 个元素的 tuple 时，元素后面必须带上逗号
t2 = (1,)                                                               # 定义 tuple
print(t2)                                                               # python 在输出只有一个元素的 tuple 时，也会加一个逗号(,)，以免你误解成数学计算意义上的小括号，输出值：(1,)

t3 = (1,2)
print(t3)                                                               # 输出 tuple，输出值：(1, 2)
print(t3[1])                                                            # 输出 tuple 中某一个元素，输出值：2


'''
dict：字典 使用键值对存储，具有极快的查找速度 相当于 PHP 中的关联数组； dict 内部存放的顺序和 key 放入的顺序是没有关系的
'''
# 定义一个 dict
d = {'Michael' : 95, 'Bob' : '75', 'Tracy' : 86}
print(d)                                                                # 输出 dict，输出值：{'Michael': 95, 'Bob': '75', 'Tracy': 86}
print(d['Michael'])                                                     # 输出 dict 中 key 为 Michael 的值，输出值：95

d['Adm'] = 67                                                           # 往 dict 中添加值（把数据放入 dict 的方法，除了在初始化时指定外，还可以通过 key 放入）
print(d)                                                                # 输出 dict，输出值：{'Michael': 95, 'Bob': '75', 'Tracy': 86, 'Adm': 67}
print(d['Adm'])                                                         # 输出 dict 中 key 为 Adm 的值，输出值：67

# 在字典中，一个 key 只能对应一个 value，多次对一个 key 放入 value，后面的值会把前面的值覆盖
d['Jack'] = 80                                                          # 往 dict 中添加值
print(d['Jack'])                                                        # 输出 dict 中 key 为 Jack 的值，输出值：80
print(d)                                                                # 输出 dict，输出值：{'Michael': 95, 'Bob': '75', 'Tracy': 86, 'Adm': 67, 'Jack': 80}
d['Jack'] = 85                                                          # 往 dict 中添加重复的 key
print(d['Jack'])                                                        # 输出 dict 中 key 为 Jack 的值，输出值：85 (后面输入的值（85）把前面的值（80）覆盖掉了)
print(d)                                                                # 输出 dict，输出值：{'Michael': 95, 'Bob': '75', 'Tracy': 86, 'Adm': 67, 'Jack': 85}

# 输入 dict 中某一个元素的值时，如果该元素的 key 不存在，会报错
# print(d['Bill'])                                                      # dict 不存在名为 Bill 的 key ，会报错
'''
get('key'[, 'value']): 为避免 key 不存在的错误，可以通过 dict 提供的 get() 方法，
如果 key 不存在，可以返回 None 或者自己指定的 value，
其中 key 为 dict 中要获取的 key ，value 为返回的值，默认为 None
'''
print(d.get('Bill'))                                                    # 获取 dict 的 key，不存在默认返回 None 输出值：None
print(d.get('Bill', -1))                                                # 获取 dict 的 key，不存返回设定值 输出值：-1

# pop(key): 删除一个 key ,其返回值为 key 对应的 value，其中 key 为要删除的 key（删除一个 key 时，其对应的 value 也会在 dict 中删除）
print(d)                                                                # 输出 dict ，输出值：{'Michael': 95, 'Bob': '75', 'Tracy': 86, 'Adm': 67, 'Jack': 85}
print(d.pop('Adm'))                                                     # 删除名为 Adm 的 key，输出值：67
print(d)                                                                # 输出 dict ，输出值：{'Michael': 95, 'Bob': '75', 'Tracy': 86, 'Jack': 85}


'''
set: 集合， set 和 dict 类似， set 也是一组 key 的集合，但不存储 value 。 由于 key 不能重复，所以 set 中没有重复的 key
'''
# 要创建一个 set ，需要提供一个 list 作为输入集合
s = set([1,2,3])                                                        # 创建一个 set ，传入的参数 [1,2,3] 是一个 list ， 而显示的 {1,2,3} 只是告诉你这个 set 内部有 1，2，3 这 3 个元素，显示的顺序也不表示 set 是有序的
print(s)                                                                # 输出 set ，输出值： {1, 2, 3}

# 重复元素在 set 中会被自动过滤
s1 = set([1,1,2,2,3,3])
print(s1)                                                               # 输出 set ，输出值： {1, 2, 3}

# add(key) ：通过 add(key) 方法可以添加元素到 set 中，重复添加相同元素只会显示一个
s.add(4)                                                                # 添加元素
print(s)                                                                # 输出 set ，输出值： {1, 2, 3, 4}
s.add(4)                                                                # 重复添加元素
print(s)                                                                # 输出 set ，输出值： {1, 2, 3, 4}

# remove(key) ：删除元素： 通过 remove(key) 方法可以删除元素
s.remove(4)                                                             # 删除 key 为 4 的元素
print(s)                                                                # 输出 set ，输出值： {1, 2, 3}
